From: Colin Walters Date: Sat, 4 Jul 2009 21:13:13 +0000 (-0400) Subject: AppWell: If an application is running, activate an existing window X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~1013^2^2~11223 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=92e9bc85a1832bdbd35c565b8961d9b7b9ab7e60;p=gnome-shell.git AppWell: If an application is running, activate an existing window Instead of relaunching, pick the first window and activate --- diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js index 0fbad13c0..372c3649c 100644 --- a/js/ui/appDisplay.js +++ b/js/ui/appDisplay.js @@ -467,8 +467,7 @@ WellDisplayItem.prototype = { })); this.actor._delegate = this; this.actor.connect('button-release-event', Lang.bind(this, function (b, e) { - this.launch(); - this.emit('activated'); + this._handleActivate(); })); let draggable = DND.makeDraggable(this.actor); @@ -480,7 +479,7 @@ WellDisplayItem.prototype = { this.actor.append(iconBox, Big.BoxPackFlags.NONE); - let count = Shell.AppMonitor.get_default().get_window_count(appInfo.appId); + this._windows = Shell.AppMonitor.get_default().get_windows_for_app(appInfo.appId) let nameBox = new Big.Box({ orientation: Big.BoxOrientation.VERTICAL, x_align: Big.BoxAlignment.CENTER }); @@ -492,7 +491,7 @@ WellDisplayItem.prototype = { line_wrap_mode: Pango.WrapMode.WORD_CHAR, text: appInfo.name }); nameBox.append(this._name, Big.BoxPackFlags.EXPAND); - if (count > 0) { + if (this._windows.length > 0) { let runningBox = new Big.Box({ /* border_color: GenericDisplay.ITEM_DISPLAY_NAME_COLOR, border: 1, padding: 1 */ }); @@ -503,6 +502,16 @@ WellDisplayItem.prototype = { } }, + _handleActivate: function () { + if (this._windows.length == 0) + this.launch(); + else { + let first = this._windows[0]; + first.activate(Clutter.get_current_event_time()); + } + this.emit('activated'); + }, + // Opens an application represented by this display item. launch : function() { this.appInfo.launch(); diff --git a/src/shell-app-monitor.c b/src/shell-app-monitor.c index f09961023..7a021d962 100644 --- a/src/shell-app-monitor.c +++ b/src/shell-app-monitor.c @@ -377,11 +377,34 @@ load_initial_windows (ShellAppMonitor *monitor) } } -guint -shell_app_monitor_get_window_count (ShellAppMonitor *self, - const char *appid) +/** + * shell_app_monitor_get_windows_for_app: + * @self: + * @appid: Find windows for this id + * + * Returns: (transfer container) (element-type MetaWindow): List of #MetaWindow corresponding to appid + */ +GSList * +shell_app_monitor_get_windows_for_app (ShellAppMonitor *self, + const char *appid) { - return GPOINTER_TO_UINT (g_hash_table_lookup (self->running_appids, appid)); + GHashTableIter iter; + gpointer key, value; + GSList *ret = NULL; + + g_hash_table_iter_init (&iter, self->window_to_appid); + + while (g_hash_table_iter_next (&iter, &key, &value)) + { + MetaWindow *window = key; + const char *id = value; + + if (strcmp (id, appid) != 0) + continue; + + ret = g_slist_prepend (ret, window); + } + return ret; } static void diff --git a/src/shell-app-monitor.h b/src/shell-app-monitor.h index 073691b1d..7ed68d05b 100644 --- a/src/shell-app-monitor.h +++ b/src/shell-app-monitor.h @@ -44,7 +44,7 @@ GSList *shell_app_monitor_get_most_used_apps (ShellAppMonitor *monitor, int activity, gint number); -guint shell_app_monitor_get_window_count (ShellAppMonitor *monitor, const char *appid); +GSList *shell_app_monitor_get_windows_for_app (ShellAppMonitor *monitor, const char *appid); /* Get whatever's running right now */ GList *shell_app_monitor_get_running_app_ids (ShellAppMonitor *monitor);